#include<bits/stdc++.h>
#define int long long
using namespace std;
const int NN=3e5+4;
vector<int>g[NN];
set<int>st[NN];
int d[NN],ans[NN];
signed main()
{
	freopen("edge.in","r",stdin);
	freopen("edge.out","w",stdout);
	int n,m,a,b;
	scanf("%lld%lld%lld%lld",&n,&m,&a,&b);
	set<pair<int,int> >edge;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		scanf("%lld%lld",&u,&v);
		edge.insert({u,v}),edge.insert({v,u});
		g[u].push_back(v),st[u].insert(v);
		g[v].push_back(u),st[v].insert(u);
	}
	for(int i=1;i<=n;i++)
		d[i]=ans[i]=1e18;
	queue<int>q;
	d[1]=0;
	q.push(1);
	while(q.size())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<g[u].size();i++)
		{
			int v=g[u][i];
			if(d[v]>d[u]+1)
			{
				d[v]=d[u]+1;
				q.push(v);
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		ans[i]=min(d[i]*a,d[i]/2*b+d[i]%2*a);
		d[i]=1e18;
	}
	d[1]=0;
	q.push(1);
	while(q.size())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<g[u].size();i++)
		{
			int v=g[u][i];
			set<int>tmp;
			for(auto it=st[v].begin();it!=st[v].end();st[v].erase(it++))
			{
				int w=*it;
				if(edge.count({u,w}))
				{
					tmp.insert(w);
					continue;
				}
				if(d[w]>d[u]+1)
				{
					d[w]=d[u]+1;
					q.push(w);
				}
			}
			swap(tmp,st[v]);
		}
	}
	for(int i=2;i<=n;i++)
	{
		if(d[i]<5e17)
			ans[i]=min(ans[i],d[i]*b);
		printf("%lld\n",ans[i]);
	}
	return 0;
}
